/*
2021-7-9
https://www.acwing.com/problem/content/1100/ 
*/


//dfs
```
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;
const int N=55;
int g[N][N];
bool st[N][N];
int n,m;

int dx[]={0,-1,0,1},dy[]={-1,0,1,0};

int dfs(int x,int y)
{
    int deep=1;
    st[x][y]=true;
    for(int i=0;i<4;i++)
    {
        if(!(g[x][y]>>i&1))
        {
            int a=x+dx[i],b=y+dy[i];
            if(a>=0 && a<n && b>=0 && b<m && !st[a][b])
            {
               deep+=dfs(a,b); 
            }
        }
    }
    return deep;
}


int main()
{
    ios::sync_with_stdio(false);
    cout.tie(NULL);
    
    cin>>n>>m;
    int res=0,cnt=0;
    
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            cin>>g[i][j];
    
    
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            if(!st[i][j])
            {
                res=max(dfs(i,j),res),cnt++;
                //cout<<i+1<<' '<<j+1<<endl;
            }
    
    cout<<cnt<<endl;
    cout<<res<<endl;
    
    return 0;
}
```

//bfs
```
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;
typedef pair<int,int> PII;
const int N=55,M=N*N;
int g[N][N];
bool st[N][N];
int n,m;
PII q[M];

int dx[]={0,-1,0,1},dy[]={-1,0,1,0};

int bfs(int x,int y)
{
    int num=0;
    int hh=0,tt=0;
    st[x][y]=true;
    q[0]={x,y};
    while(hh<=tt)
    {
        auto temp=q[hh++];
        num++;
        
        for(int i=0;i<4;i++)
        {
            int a=temp.first+dx[i],b=temp.second+dy[i];
            if(a<0 || a>=n || b<0 || b>=m) continue;
            if(st[a][b]) continue;
            if(g[temp.first][temp.second]>>i&1) continue;
            
            q[++tt]={a,b};
            st[a][b]=true;
        }
    }
    return num;
}

int main()
{
    ios::sync_with_stdio(false);
    cout.tie(NULL);
    
    cin>>n>>m;
    int res=0,cnt=0;
    
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            cin>>g[i][j];
    
    
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            if(!st[i][j])
            {
                res=max(bfs(i,j),res),cnt++;
            }
    
    cout<<cnt<<endl;
    cout<<res<<endl;
    
    return 0;
}
```

